//某套连招动作记作序列 arr，其中 arr[i] 为第 i 个招式的名字。请返回 arr 中最多可以出连续不重复的多少个招式。 
//
// 
//
// 示例 1： 
//
// 
//输入：arr = "dbascDdad"
//输出：6
//解释：因为连续且最长的招式序列是 "dbascD" 或 "bascDd"，所以其长度为 6。
// 
//
// 示例 2： 
//
// 
//输入：arr = "KKK"
//输出：1
//解释：因为无重复字符的最长子串是 "K"，所以其长度为 1。
// 
//
// 示例 3： 
//
// 
//输入：arr = "pwwkew"
//输出：3
//解释：因为连续且最长的招式序列是 "wke"，所以其长度为 3。     
//请注意区分 子串 与 子序列 的概念：你的答案必须是 连续招式 的长度，也就是 子串。而 "pwke" 是一个非连续的 子序列，不是 子串。
// 
//
// 
//
// 提示： 
//
// 
// 0 <= arr.length <= 40000 
// arr 由英文字母、数字、符号和空格组成。 
// 
//
// 
//
// 注意：本题与主站 3 题相同：https://leetcode-cn.com/problems/longest-substring-without-
//repeating-characters/ 
//
// 
//
// Related Topics 哈希表 字符串 滑动窗口 👍 628 👎 0


package LeetCode.editor.cn;

/**
 * @author ldltd
 * @date 2025-05-17 18:50:46
 * @description LCR 167.招式拆解 I
 */
public class ZuiChangBuHanZhongFuZiFuDeZiZiFuChuanLcof{
	 public static void main(String[] args) {
	 	 //测试代码
	 	 ZuiChangBuHanZhongFuZiFuDeZiZiFuChuanLcof fun=new ZuiChangBuHanZhongFuZiFuDeZiZiFuChuanLcof();
	 	 Solution solution = fun.new Solution();
		solution.dismantlingAction("dbascDdad");
	 }
	 
//力扣代码
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
		 //最长不重复连续子串,check的过程其实有点慢
    public int dismantlingAction1(String arr) {
		int n = arr.length();
		int res=0;
		for(int i=0,j=0;i<n;i++){
       		while(j<=i&&check(i,j,arr)) j++;
			res=Math.max(res,i-j+1);
   		}
		return res;
    }

	private boolean check(int i, int j,String arr) {
		int [] ch=new int[256];
		for (; j <=i ; j++) {
			int i1 = arr.charAt(j);
			ch[i1]++;
			if(ch[i1]>1)
				return true;
		}
		return false;
	}
	//滑动窗口+计数
	public int dismantlingAction2(String arr) {
		int n = arr.length();
		int res=0;
		int [] ch=new int[256];
		for(int i=0,j=0;i<n;i++){
			char c = arr.charAt(i);
			ch[c]++;
			while(ch[c]>1){
				ch[arr.charAt(j)]--;
				j++;
			}
			res=Math.max(res,i-j+1);
		}
		return res;
	}
	public  int dismantlingAction(String s){
		//滑动窗口，记录每个字符最后一次出现的坐标
		//每次重复时，作为统计区间的左端点，每次记录出现的位置
		int [] last= new int[128];
		int res=0;
		int l=0;
		for (int i = 0; i < s.length(); i++) {
			//ascii码
			int index=s.charAt(i);
			//更新左端点
			l=Math.max(l,last[index]);
			//更新结果
			res=Math.max(res,i-l+1);
			//保存结果
			last[index]=i+1;
		}
		return res;
	}

}
//leetcode submit region end(Prohibit modification and deletion)

}
